#include "soft_timer.h"
#include "mlog.h"

/*系统时间,单位ms*/
uint32_t system_time = 0;

ssoft_Timer timerArr[MAX_TIMER_NUM];
/**********************************************************
函数      名：ssoft_TimerInit
函数功能描述：软件定时器数组初始化
函数    参数：无
函数  返回值：无
函数    时间：20190904
函数    作者：Cc
函数历史修改：无

***********************************************************/
void ssoft_TimerInit(void)
{
    uint8_t i = 0;
    for (i = 0; i < MAX_TIMER_NUM; i++) {
        timerArr[i].sTimerStatus = TIMER_DISABLE;
        timerArr[i].timerFunc = NULL;
        timerArr[i].timerStartTime = 0;
        timerArr[i].timerTime = 0;
        timerArr[i].timerInUsing = 0;
    }
}
/**********************************************************
函数      名：ssoft_TimerCreate
函数功能描述：创建软件定时器
函数    参数：func：回调函数
               mode：第一次回调方式
               timer：定时器时间
函数  返回值：无
函数    时间：20190904
函数    作者：Cc
函数历史修改：无

***********************************************************/
ssoft_Timer* ssoft_TimerCreate(timer_callback_function func, SoftTimerMode mode,
                               uint32_t time)
{
    uint8_t i;
    if (func == NULL) {
        mprintf(LOG_ERROR, "callback func null!!!\r\n");
        return NULL;
    }
    for (i = 0; i < MAX_TIMER_NUM; i++) {
        if (timerArr[i].timerInUsing != TIMER_INUSE) {
            timerArr[i].timerInUsing = TIMER_INUSE;
            timerArr[i].timerFunc = func;
            if (mode == TIMER_CALL_IMMEDIATELY) {
                timerArr[i].timerStartTime = getSystemTime() - time;
            } else {
                timerArr[i].timerStartTime = getSystemTime();
            }

            timerArr[i].sTimerStatus = TIMER_ENABLE;
            timerArr[i].timerTime = time;
            return &timerArr[i];
        }
    }
    mprintf(LOG_ERROR, "no timer to use!!!\r\n");
    return NULL;
}
/**********************************************************
函数      名：ssoft_TimerDelete
函数功能描述：删除定时器
函数    参数：无
函数  返回值：无
函数    时间：20180904
函数    作者：Cc
函数历史修改：无

***********************************************************/
SoftTimerReturn ssoft_TimerDelete(ssoft_Timer* timer)
{
    uint8_t i;
    if (timer == NULL) {
        mprintf(LOG_ERROR, "the timer is null !!!\r\n");
        return TIMER_PRARM_ERR;
    }
    for (i = 0; i < MAX_TIMER_NUM; i++) {
        if ((&timerArr[i]) == timer) {
            timerArr[i].timerInUsing = TIMER_UNUSE;
            timerArr[i].sTimerStatus = TIMER_DISABLE;
            return TIMER_OK;
        }
    }
    mprintf(LOG_ERROR, "timer error or the time had del!!!!.\r\n");
    return TIMER_PRARM_ERR;
}
/**********************************************************
函数      名：ssoft_TimerTask
函数功能描述：定时器任务
函数    参数：无
函数  返回值：无
函数    时间：20180904
函数    作者：Cc
函数历史修改：无

***********************************************************/
void ssoft_TimerTask(void)
{
    uint8_t i;
    for (i = 0; i < MAX_TIMER_NUM; i++) {
        if ((timerArr[i].timerInUsing == TIMER_INUSE) &&
            (timerArr[i].timerFunc != NULL) &&
            (timerArr[i].sTimerStatus == TIMER_ENABLE)) {
            if ((system_time - timerArr[i].timerStartTime) >
                timerArr[i].timerTime) {
                if (timerArr[i].timerFunc != NULL) {
                    timerArr[i].timerFunc(NULL);
                } else {
                    mprintf(LOG_ERROR, "the timer callback fuc null!!!\r\n");
                }
                timerArr[i].timerStartTime = system_time;
            }
        }
    }
}
/**********************************************************
函数      名：getSystemTime
函数功能描述：获取系统时间
函数    参数：无
函数  返回值：无
函数    时间：20180904
函数    作者：Cc
函数历史修改：无

***********************************************************/
uint32_t getSystemTime(void) { return system_time; }
/**********************************************************
函数      名：updateSystemTime
函数功能描述：更新定时器计时时间
函数    参数：无
函数  返回值：无
函数    时间：20180904
函数    作者：Cc
函数历史修改：无

***********************************************************/
void updateSystemTime(void) { system_time++; }

ssoft_Timer* testTimer;
/***********************测试函数**************************/
void test_timer_callback_func(void* arg)
{
    static uint8_t sec = 0;
    uint8_t i = 0, count = 0;
    sec++;
    mprintf(LOG_INFO, "this is test timer callback function:%d.\r\n", sec);
    if (sec > 10) {
        ssoft_TimerDelete(testTimer);
        mprintf(LOG_INFO, "del timer\r\n");
    }
    for (i = 0; i < MAX_TIMER_NUM; i++) {
        if (timerArr[i].timerInUsing == TIMER_INUSE) {
            mprintf(LOG_INFO, "timer callback fuc addr:%x。\r\n",
                    (uint32_t)timerArr[i].timerFunc);
            count++;
        }
    }
    mprintf(LOG_INFO, "最多可使用定时器数目：%d。\r\n", MAX_TIMER_NUM);
    mprintf(LOG_INFO, "已使用定时器：%d。剩余定时器：%d。\r\n", count,
            MAX_TIMER_NUM - count);
}

void test_TimerInit(void)
{
    testTimer =
        ssoft_TimerCreate(test_timer_callback_func, TIMER_CALL_WAIT, 10000000);
    if (testTimer == NULL) {
        mprintf(LOG_ERROR, "timer init error!!!\r\n");
    }
}
